package com.kosam.leetcode.offer;

import java.util.ArrayList;

/**
 * 面试题45. 把数组排成最小的数
 * 输入一个正整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: [10,2]
 * 输出: "102"
 * 示例 2:
 *
 * 输入: [3,30,34,5,9]
 * 输出: "3033459"
 *  
 *
 * 提示:
 *
 * 0 < nums.length <= 100
 * 说明:
 *
 * 输出结果可能非常大，所以你需要返回一个字符串而不是整数
 * 拼接起来的数字可能会有前导 0，最后结果不需要去掉前导 0
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Offer45 {

    /**
     * 思路:
     * 1. 将整数数组转为字符串数组
     * 2. 使用内置函数，将数组元素两两对比，如果 a+b < b+a, 那么 a < b
     * @param nums
     * @return
     */
    public static String minNumber(int[] nums) {
        ArrayList<String> numsStrList = new ArrayList<String>(nums.length);
        for (int num : nums) numsStrList.add(String.valueOf(num));

        numsStrList.sort((o1, o2) -> (o1 + o2).compareTo(o2 + o1));
        return String.join("", numsStrList);
    }

    public static void main(String[] args) {
        //  [3,30,34,5,9]
        int[] nums = new int[]{3, 30, 34, 5, 9};
        int[] nums2 = new int[]{10, 2, 0};
        System.out.println(minNumber(nums2));
    }
}
